gogrep — это одна из моих любимых утилит для работы с Go. Она позволяет находить код по синтаксическим шаблонам, фильтровать результаты по типам выражений, а также выполнять замену (тоже по шаблону).
В этой заметке я расскажу как использовать gogrep
, а также о VS Code расширении для более удобной работы с gogrep
прямо из редактора.
Зачем нужен gogrep
Если в тезисах, то gogrep
может быть полезен при:
- Рефакторинге
- Изучении кодовой базы
- Поиске подозрительного кода (пример: ruleguard)
Рассмотрим пример, который демонстрирует изящность и эффективность структурного поиска.
Функции a()
и b()
выполняют одинаковые операции:
func a(xs []int) []int { xs = append(xs, 1) xs = append(xs, 2) return xs } func b(xs []int) []int { xs = append(xs, 1, 2) return xs }
Допустим, мы хотим переписать все места, где вызовы append
можно схлопнуть.
Попробуем gogrep
:
- Находим все подходящие пары с помощью
-x
шаблона$x=append($x,$a); $x=append($x,$b)
- Через
-s
шаблон$x=append(